package com.xjk.encryp;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * 3DES加密解密
 */
public class DESedeUtil {

    // 3DES方式
    private static String algorithm = "DESede";
    // 编码方式
    private static String encoding = "UTF-8";

    /**
     * 将待加密的内容先进行utf-8编码成byte数组 将加密得到的byte数组生成16进制字符串
     * 
     * @param content 待加密的内容
     * @param iv 向量
     * @param secretKey 密钥 24位
     * @return
     */
    public static byte[] encrypt(String content, String iv, String secretKey) {
        byte[] result = null;
        try {
            // 得到密钥
            SecretKey key = new SecretKeySpec(secretKey.getBytes(encoding), algorithm);
            // 初始化密码器
            Cipher cipher = Cipher.getInstance(algorithm);
            // 根据encoding编码将待加密内容转成byte数组
            byte[] contentByteArray = content.getBytes(encoding);
            if (iv != null) {
                // 初始化向量
                IvParameterSpec ips = new IvParameterSpec(iv.getBytes(encoding));
                // 初始化密码器（加密，密钥）
                cipher.init(Cipher.ENCRYPT_MODE, key, ips);
            } else {
                // 初始化密码器（加密，密钥）
                cipher.init(Cipher.ENCRYPT_MODE, key);
            }
            // 密码器执行加密得到字节数组
            result = cipher.doFinal(contentByteArray);
        } catch (Exception e) {
             e.printStackTrace();
        }
        return result;
    }

    /**
     * 解析3DES加密后的字符串 ，先将16进制字符串转成byte[] 再解密得到byte数组，utf-8编码为字符串，进行还原
     * 
     * @param content 等解密内容
     * @param iv 向量
     * @param secretKey 密钥
     * @return
     */
    public static byte[] decrypt(byte[] content, String iv, String secretKey) {
        // javax.crypto.spec.DESedeKeySpec
        byte[] result = null;
        try {
            // 生成密钥
            SecretKey key = new SecretKeySpec(secretKey.getBytes(encoding), algorithm);
            // 定义密码器
            Cipher cipher = Cipher.getInstance(algorithm);
            if (iv != null) {
                // 初始化向量
                IvParameterSpec ips = new IvParameterSpec(iv.getBytes(encoding));
                // 初始化密码器方式（解密，密钥）
                cipher.init(Cipher.DECRYPT_MODE, key, ips);
            } else {
                // 初始化密码器方式（解密，密钥）
                cipher.init(Cipher.DECRYPT_MODE, key);
            }
            // 执行解密操作
            result = cipher.doFinal(content);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

}
